package Soligee.controller.bo;
import Soligee.controller.facade.sessionFacadeImplements.SessionFacadeBuscarImplements;
import Soligee.decorador.DecoradorNF;
import Soligee.model.vo.cadastros.ProdutoVO;
import Soligee.model.vo.lancamentos.ItensNFEntradaVO;


import com.icesoft.faces.component.ext.HtmlInputText;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class NFEntradaBO {

    private double valorTotalNota;
    //valor total dos produtos
    private double valorTotalProdutos;
    
    public List<ProdutoVO> listaProdutos = new ArrayList();


    // meotodo para calcular o total produtos a partir de uma lista decoradora
    public double calculaTotalProduto(List<DecoradorNF> lista) {
        double total = 0;
        try{
            for (int i = 0; i < lista.size(); i++) {
                total += lista.get(i).getTotal();
            }
        }catch (ArrayIndexOutOfBoundsException ex){
                System.err.println("Erro:" + ex.getMessage());
                ex.getStackTrace();
        }
        return total;
    }

    public double calculaTotalNFEntrada(double valorIPI, double valorFrete, double valorDesconto,
                                        double valorEmbalagem, double totalProduto){
        double totalNF = 0;
        try{

         totalNF = (totalProduto + (valorIPI + valorFrete + valorEmbalagem)) - valorDesconto;
         this.setValorTotalNota(totalNF);
        }catch (NumberFormatException ex){
            System.err.println("Erro:" + ex.getMessage());
            ex.getStackTrace();
        }
        return totalNF;
    }

    public double calcularPorcentagem(HtmlInputText valor, HtmlInputText total) {
        double porc = 0;
        try{
        porc = (Double.parseDouble(valor.getValue().toString()) * 100) / Double.parseDouble(total.getValue().toString()) ;
        }
        catch (ArithmeticException ex){
            System.err.println("Erro:" + ex.getMessage());
            ex.getStackTrace();
        }
        return porc;
    }

    public double calcularValor(HtmlInputText porcentagem, HtmlInputText total) {
        double val =0;
        try{
            val =(Double.parseDouble(porcentagem.getValue().toString()) * Double.parseDouble(total.getValue().toString()))/100;
        }catch (ArithmeticException ex){
                System.err.println("Erro:" + ex.getMessage());
                ex.getStackTrace();
         }
        return val;
    }

    //metodo necessario para montar os itens da tabela
    public List<DecoradorNF> montaItens(int chavePrimaria){
        List<DecoradorNF> listaDecoradora= new ArrayList();
        //facade para busca
        SessionFacadeBuscarImplements facadeBusca = new SessionFacadeBuscarImplements();
        //busca a lista de itens do pedido
        Iterator it = facadeBusca.buscaComItem(ItensNFEntradaVO.class, "nfentrada").iterator();
        while(it.hasNext()){
            ItensNFEntradaVO item = (ItensNFEntradaVO)it.next();
            if(item.getChaveComposta().getNfentrada().getCodNFEntrada() == chavePrimaria){
               ProdutoVO produto = (ProdutoVO)facadeBusca.buscaPorCodigo(ProdutoVO.class,"codProduto", item.getChaveComposta().getProduto().getCodProduto())
                        .iterator().next();
               DecoradorNF decorador = new DecoradorNF();
               decorador.setCodProduto(produto.getCodProduto());
               decorador.setDescricaoProduto(produto.getDescricao());
               decorador.setQuantidade(item.getQtdadeItens());
               decorador.setValorUnitario(item.getValorUnitarioItem());
               decorador.setTotal();
               listaDecoradora.add(decorador);
               //adiciona os produtos em uma lista para posterior utilização em alterar ou cadastar
               listaProdutos.add(produto);
            }//fim if
        }//fim while
        return listaDecoradora;
    }

    public List<ItensNFEntradaVO> finalizaNota(List<DecoradorNF> listaDecoradora){
        List<ItensNFEntradaVO> listaItensNF = new ArrayList();
        //le a lista de decoradores simplismente para coleta de valores
        Iterator it =  listaDecoradora.iterator();
        while (it.hasNext()) {
            //objeto decorador para manipulacao da lista
            DecoradorNF decoradorNF = (DecoradorNF) it.next();
            decoradorNF.getCodProduto();
            //cria um item para cade decorador de acordo com seus valores
            ItensNFEntradaVO itemNf = new ItensNFEntradaVO(decoradorNF.getQuantidade(), decoradorNF.getValorUnitario(), decoradorNF.getTotal());
            listaItensNF.add(itemNf);
        }
        //calcula total dos produtos e seta no objeto criado anteriormente
        double total = 0;
        try{
            for (int i = 0; i < listaItensNF.size(); i++) {
                total += listaItensNF.get(i).getTotal();
            }
        }catch (ArrayIndexOutOfBoundsException ex){
                System.err.println("Erro:" + ex.getMessage());
                ex.getStackTrace();
        }
        this.setValorTotalProdutos(total);
        return listaItensNF;
    }//fim finalizar nota

    //gets e stters
    public List<ProdutoVO> getListaProdutos() {
        return listaProdutos;
    }

    public void setListaProdutos(List<ProdutoVO> listaProdutos) {
        this.listaProdutos = listaProdutos;
    }  
    
    public double getValorTotalNota() {
        return valorTotalNota;
    }

    public void setValorTotalNota(double valorTotalNota) {
        this.valorTotalNota = valorTotalNota;
    }

    public double getValorTotalProdutos() {
        return valorTotalProdutos;
    }

    public void setValorTotalProdutos(double valorTotalProdutos) {
        this.valorTotalProdutos = valorTotalProdutos;
    }
}
